home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / glibmm-2.4 / proc / m4 / vfunc.m4 < prev   
M4 Source File  |  2006-04-20  |  4KB  |  124 lines

  1. dnl
  2. dnl _VFUNC_PH(gtkname, crettype, cargs and names)
  3. dnl Create a callback and set it in our derived G*Class.
  4. dnl
  5. define(`_VFUNC_PH',`dnl
  6. _PUSH(SECTION_PCC_CLASS_INIT_VFUNCS)
  7.   klass->$1 = `&'$1_vfunc_callback;
  8. _SECTION(SECTION_PH_VFUNCS)
  9.   static $2 $1_vfunc_callback`'($3);
  10. _POP()')
  11.  
  12.  
  13. dnl               $1      $2       $3        $4
  14. dnl _VFUNC_PCC(cppname,gtkname,cpprettype,crettype,
  15. dnl                        $5                $6          $7            $8        $9
  16. dnl                  `<cargs and names>',`<cnames>',`<cpparg names>',firstarg, refreturn_ctype)
  17. dnl
  18. define(`_VFUNC_PCC',`dnl
  19. _PUSH(SECTION_PCC_VFUNCS)
  20. $4 __CPPNAME__`'_Class::$2_vfunc_callback`'($5)
  21. {
  22. dnl  We cast twice to allow for multiple-inheritance casts, which might 
  23. dnl  change the value.  We have to use a dynamic_cast because we do not 
  24. dnl  know the actual type from which to cast up.
  25.   CppObjectType *const obj = dynamic_cast<CppObjectType*>(
  26.       Glib::ObjectBase::_get_current_wrapper`'((GObject*)$8));
  27.  
  28. _IMPORT(SECTION_CHECK)
  29.   // Non-gtkmmproc-generated custom classes implicitly call the default
  30.   // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc-
  31.   // generated classes can use this optimisation, which avoids the unnecessary
  32.   // parameter conversions if there is no possibility of the virtual function
  33.   // being overridden:
  34.   if(obj && obj->is_derived_())
  35.   {
  36.     try // Trap C++ exceptions which would normally be lost because this is a C callback.
  37.     {
  38.       // Call the virtual member method, which derived classes might override.
  39. ifelse($4,void,`dnl
  40.       obj->$1`'($7);
  41. ',`dnl
  42. ifelse($9,refreturn_ctype,`dnl Assume Glib::unwrap_copy() is correct if refreturn_ctype is requested.
  43.       return Glib::unwrap_copy`'(`obj->$1'($7));
  44. ',`dnl
  45.       return _CONVERT($3,$4,`obj->$1`'($7)');
  46. ')dnl
  47. ')dnl
  48.     }
  49.     catch(...)
  50.     {
  51.       Glib::exception_handlers_invoke`'();
  52.     }
  53.   }
  54.   else
  55.   {
  56.     BaseClassType *const base = static_cast<BaseClassType*>(
  57. ifdef(`__BOOL_IS_INTERFACE__',`dnl
  58.         _IFACE_PARENT_FROM_OBJECT($8)dnl
  59. ',`dnl
  60.         _PARENT_GCLASS_FROM_OBJECT($8)dnl
  61. ')    );
  62. dnl    g_assert(base != 0);
  63.  
  64.     // Call the original underlying C function:
  65.     if(base && base->$2)
  66.       ifelse($4,void,,`return ')(*base->$2)`'($6);
  67.   }
  68. ifelse($4,void,,`dnl
  69.  
  70.   typedef $4 RType;
  71.   return RType`'();
  72. ')dnl
  73. }
  74.  
  75. _POP()')
  76.  
  77.  
  78. #                $1      $2       $3           $4
  79. # _VFUNC_H(vfunc_name, rettype, `<cppargs>', is_const)
  80. #
  81. define(`_VFUNC_H',`dnl
  82. _PUSH(SECTION_H_VFUNCS)
  83. ifelse($4,`1',`dnl
  84. virtual $2 $1`'($3) const;
  85. ',`dnl
  86. virtual $2 $1`'($3);
  87. ')
  88.  
  89. _POP()')
  90.  
  91. #                $1        $2        $3           $4          $5            $6         $7          $8
  92. # _VFUNC_CC(vfunc_name, gtkname, cpp_rettype, c_rettype, `<cppargs>', `<carg_names>', is_const, refreturn)
  93. #
  94. define(`_VFUNC_CC',`dnl
  95. _PUSH(SECTION_CC_VFUNCS)
  96. $3 __NAMESPACE__::__CPPNAME__::$1`'($5) ifelse($7,1,const,)
  97. {
  98.   BaseClassType *const base = static_cast<BaseClassType*>(
  99. ifdef(`__BOOL_IS_INTERFACE__',`dnl
  100.       _IFACE_PARENT_FROM_OBJECT(gobject_)dnl
  101. ',`dnl
  102.       _PARENT_GCLASS_FROM_OBJECT(gobject_)dnl
  103. ')  );
  104. dnl  g_assert(base != 0);
  105.  
  106.   if(base && base->$2)
  107. ifelse($3,void,`dnl
  108.     (*base->$2)`'(ifelse(`$7',1,const_cast<__CNAME__*>(gobj()),gobj())`'_COMMA_PREFIX($6));
  109. ',`dnl
  110. ifelse($8,refreturn,`dnl Assume Glib::wrap() is correct if refreturn is requested.
  111.     return Glib::wrap((*base->$2)`'(ifelse(`$7',1,const_cast<__CNAME__*>(gobj()),gobj())`'_COMMA_PREFIX($6)), true);
  112. ',`dnl
  113.     return _CONVERT($4,$3,`(*base->$2)`'(ifelse(`$7',1,const_cast<__CNAME__*>(gobj()),gobj())`'_COMMA_PREFIX($6))');
  114. ')dnl
  115.  
  116.   typedef $3 RType;
  117.   return RType`'();
  118. ')dnl
  119. }
  120.  
  121. _POP()')
  122.  
  123.  
  124.